#include <bits/stdc++.h>
#define int long long
using namespace std;

const int maxn = 1e5 + 5;
int head[maxn]; // 记录所有的节点连接的第一条边的编号
int cnt; // 记录边的编号
int nxt[maxn][17];
int depth[maxn];
struct Edge {
	int nex;
	int to;
}edges[maxn << 1];

void add(int from, int to){
	edges[++cnt].nex = head[from];
	edges[cnt].to = to;
	head[from] = cnt;
}

void DFS(int p, int i){
	nxt[i][0] = p; // 直系父亲节点
	depth[i] = depth[p] + 1; // 更新深度
	// 遍历其他节点
	for (int e = head[i];e != 0;e=edges[e].nex) {
		int t = edges[e].to;
		if (t==p) {
			continue; // 表示遍历过了
		}
		DFS(i, t);
	}
}


int lca(int a, int b){
	if (depth[a] < depth[b]) {
		// 让 a 当深的
		swap(a, b);
	}
	// 开始跳到同一高度
	for (int i=16;i>=0;i--) {
		if (depth[nxt[a][i]] >= depth[b]) {
			a = nxt[a][i]; // 往上跳
		}
	}
	if (a==b) {
		return a;
	}
	// 跳到同一高度后, 开始同时跳
	for (int i=16;i>=0;i--) {
		if (nxt[a][i] != nxt[b][i]) {
			// 两个节点的父亲节点不同再跳
			a = nxt[a][i];
			b = nxt[b][i];
		}
	}
	// 最后两个节点的父亲节点一定相同
	return nxt[a][0];
}


void solve(){
	int n;
	cin >> n;
	for (int i=1;i<n;i++) {
		int a, b;
		cin >> a >> b;
		add(a, b);
		add(b, a);
	}
	// 使用 DFS 求出每个节点的父亲节点
	DFS(0, 1);
	// 使用倍增进行预处理
	for (int j=1;j<=16;j++) {
		for (int i=1;i<=n;i++) {
			nxt[i][j] = nxt[nxt[i][j-1]][j-1];
		}
	}
	int q;
	cin >> q;
	for (int i=1;i<=q;i++) {
		int a, b;
		cin >> a >> b;
		cout << lca(a, b) << '\n';
	}
}



signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	t=1;
	while(t--){
		solve();
	}
	return 0;
}
